//
//  methodsTest.swift
//  BJ12366Swift
//
//  Created by ZRAR on 16/2/26.
//  Copyright © 2016年 ZRAR. All rights reserved.
//

import UIKit

class MethodsTest: NSObject {
    //swift中方法的名称通常用一个介词指向方法的第一个参数，比如：with for by
    var x = 0.0,y = 0.0
    func isToTheRightOfX(x:Double)->Bool{
        //self消除方法参数x和实例属性x之间的歧义
        return self.x > x
    }
    //没有歧义，不需要加self
    func istoLeftOfY(yy:Double)->Bool{
        
        return y < yy
    }
    //结构体和枚举是值类型，一般情况下，值类型的属性不能在它的实例方法中被修改
    //你可以选择变异（mutating）这个方法，然后方法就可以从方法内部改变它的属性，改变之后的值都会在方法结束之后保存下来
    struct Point{
        var x = 0.0,y = 0.0
        mutating func moveByX(deltax:Double ,y deltay:Double){
            y += deltay
            x += deltax
        }
        mutating func moveBYy(deltax:Double ,y deltay:Double){
            self = Point(x: x + deltax, y: y + deltay)
        }
    }
    override init() {
        super.init()
        var somePoint = Point(x: 1.0, y: 1.0)
        somePoint.moveByX(2.0, y: 3.0)
        
    }
    //下标脚本选项
    

    //类型方法
    static func someTypeMethod(){
        
        
        
    }
    struct Matrix {
        let rows:Int,columns:Int
        var grid:[Double]
        init(rows:Int,columns:Int){
            self.rows = rows
            self.columns = columns
            grid = Array(count:rows * columns , repeatedValue: 0.0)
        }
        func indexlsValidForRow(row:Int, column:Int)->Bool{
            
            return row >= 0 && row < rows && columns >= 0 && column < columns
        }
        //下标脚本关键字
        subscript(row:Int, column:Int)->Double{
            get{
                assert(indexlsValidForRow(row, column: column),"Index out of range")
                
                return grid[ (row * columns) + column ]
                //return 0.0
            }
            set{
                assert(indexlsValidForRow(row, column: column),"Index out of range")
                grid[(row * columns) + column] = newValue
            }
        }
    }
    //重写：子类可以为继承来的实例方法，类方法，实例属性，或下标脚本提供自己定制的实现.重写某个特性要在前面加上override
    
    //防止重写，你可以通过把方法，属性或下标脚本标记为final
}

